package ConnectivityEditor.Window; import java.nio.FloatBuffer; import java.util.ArrayList; import javax.media.opengl.GL2; import Builder.MainCamera; import Common.Ray3; import Common.Vector3f; import Connectivity.Connectivity; import Connectivity.Slider; import ConnectivityEditor.Connectivity.AxleT; import LDraw.Support.MatrixMath; import LDraw.Support.type.LDrawGridTypeT; public class SliderRenderer extends DefaultConnectivityRenderer { private Slider slider; public SliderRenderer(MainCamera camera, Connectivity conn) { super(camera, conn); slider = (Slider) conn; } @Override public void draw(GL2 gl2) { if (slider.gettype() % 2 == 0) {// socket if (conn.isSelected()) gl2.glColor3f(0.2f, 0.2f, 0.2f); else gl2.glColor3f(1f, 1f, 0.5f); } else { if (conn.isSelected()) gl2.glColor3f(0.2f, 0.2f, 0.2f); else gl2.glColor3f(0f, 0f, 0.5f); } gl2.glLoadMatrixf(camera.getModelView(), 0); gl2.glBegin(GL2.GL_QUADS); // draw using triangles for (Vector3f vertex : getSliderVertices()) gl2.glVertex3f(vertex.x, vertex.y, vertex.z); gl2.glEnd(); gl2.glBegin(GL2.GL_TRIANGLES); for (Vector3f vertex : getCapVertices()) gl2.glVertex3f(vertex.x, vertex.y, vertex.z); gl2.glEnd(); } private Vector3f[] getCapVertices() { ArrayList<Vector3f> vertices = new ArrayList<Vector3f>(); final float diskRadius = LDrawGridTypeT.Medium.getXZValue()/2; Vector3f vertex = null; int slice = 24; if (slider.getstartCapped() == 1) { vertex = new Vector3f(); for (int sliceIndex = 0; sliceIndex < slice - 1; sliceIndex++) { vertices.add(vertex); vertices.add(vertex.add( (float) (diskRadius * Math.cos((sliceIndex) * Math.PI * 2 / (slice - 1))), 0, (float) (diskRadius * Math.sin((sliceIndex) * Math.PI * 2 / (slice - 1))))); vertices.add(vertex.add( (float) (diskRadius * Math.cos((sliceIndex + 1) * Math.PI * 2 / (slice - 1))), 0, (float) (diskRadius * Math.sin((sliceIndex + 1) * Math.PI * 2 / (slice - 1))))); } } if (slider.getendCapped() == 1) { vertex = new Vector3f(0, -slider.getlength(), 0); for (int sliceIndex = 0; sliceIndex < slice - 1; sliceIndex++) { vertices.add(vertex); vertices.add(vertex.add( (float) (diskRadius * Math.cos((sliceIndex) * Math.PI * 2 / (slice - 1))), 0, (float) (diskRadius * Math.sin((sliceIndex) * Math.PI * 2 / (slice - 1))))); vertices.add(vertex.add( (float) (diskRadius * Math.cos((sliceIndex + 1) * Math.PI * 2 / (slice - 1))), 0, (float) (diskRadius * Math.sin((sliceIndex + 1) * Math.PI * 2 / (slice - 1))))); } } Vector3f[] retArray = new Vector3f[vertices.size()]; for (int i = 0; i < vertices.size(); i++) { retArray[i] = slider.getTransformMatrix().transformPoint( vertices.get(i)); } return retArray; } private Vector3f[] getSliderVertices() { ArrayList<Vector3f> vertices = new ArrayList<Vector3f>(); final float width = 2; final float length = slider.getlength(); final float thickness = 2; vertices.add(new Vector3f(-width, 0, thickness)); vertices.add(new Vector3f(-width, 0, -thickness)); vertices.add(new Vector3f(-width, -length, -thickness)); vertices.add(new Vector3f(-width, -length, thickness)); vertices.add(new Vector3f(width, 0, thickness)); vertices.add(new Vector3f(width, 0, -thickness)); vertices.add(new Vector3f(width, -length, -thickness)); vertices.add(new Vector3f(width, -length, thickness)); vertices.add(new Vector3f(-width, 0, -thickness)); vertices.add(new Vector3f(width, 0, -thickness)); vertices.add(new Vector3f(width, -length, -thickness)); vertices.add(new Vector3f(-width, -length, -thickness)); vertices.add(new Vector3f(-width, 0, thickness)); vertices.add(new Vector3f(width, 0, thickness)); vertices.add(new Vector3f(width, -length, thickness)); vertices.add(new Vector3f(-width, -length, thickness)); // vertices.add(new Vector3f(thickness, 0, width)); vertices.add(new Vector3f(thickness, 0, -width)); vertices.add(new Vector3f(-thickness, 0, -width)); vertices.add(new Vector3f(-thickness, 0, width)); vertices.add(new Vector3f(thickness, -length, width)); vertices.add(new Vector3f(thickness, -length, -width)); vertices.add(new Vector3f(-thickness, -length, -width)); vertices.add(new Vector3f(-thickness, -length, width)); Vector3f[] retArray = new Vector3f[vertices.size()]; for (int i = 0; i < vertices.size(); i++) { retArray[i] = slider.getTransformMatrix().transformPoint( vertices.get(i)); } return retArray; } @Override public boolean isHitted(MainCamera camera, float screenX, float screenY, FloatBuffer distance) { Ray3 ray = camera.getRay(screenX, screenY); FloatBuffer distanceTemp = FloatBuffer.allocate(1); boolean isHitted = false; Vector3f[] vertices = getSliderVertices(); for (int i = 0; i < vertices.length; i += 4) { if (MatrixMath.V3RayIntersectsTriangle(ray, vertices[i], vertices[(i + 1)], vertices[(i + 2)], distanceTemp, null)) { if (distance != null) if (distanceTemp.get(0) < distance.get(0)) distance.put(0, distanceTemp.get(0)); isHitted = true; } if (MatrixMath.V3RayIntersectsTriangle(ray, vertices[i + 2], vertices[(i + 3)], vertices[i], distanceTemp, null)) { if (distance != null) if (distanceTemp.get(0) < distance.get(0)) distance.put(0, distanceTemp.get(0)); isHitted = true; } } vertices = getCapVertices(); for (int i = 0; i < vertices.length; i += 3) { if (MatrixMath.V3RayIntersectsTriangle(ray, vertices[i], vertices[(i + 1)], vertices[(i + 2)], distanceTemp, null)) { if (distance != null) if (distanceTemp.get(0) < distance.get(0)) distance.put(0, distanceTemp.get(0)); isHitted = true; } } lastHittedDistance = distance.get(0); return isHitted; } }